package com.edu.juc.jmm.volatiles;

public class SingletonTest {
    private volatile static SingletonTest singleton;

    private SingletonTest() {
    }

    public static SingletonTest getInstance() {
        if (singleton == null) { // 问题出在这个条件
            synchronized (SingletonTest.class) {
                if (singleton == null) {
                    /*
                     * 创建对象：（Right）
                     * memory = allocate(); // 1. 分配对象内存空间
                     * ctorInstance(memory); // 2. 初始化对象
                     * instance = memory; // 3. 设置instance指向刚分配的内存地址
                     *
                     * 问题所在：
                     * memory = allocate(); // 1. 分配对象内存空间
                     * instance = memory; // 3. 设置instance指向刚分配的内存地址
                     *                      // 此时对象还没有初始化
                     * ctorInstance(memory); // 2. 初始化对象
                     */
                    singleton = new SingletonTest();
                }
            }
        }
        return singleton;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(() -> System.out.println(SingletonTest.getInstance())).start();
        }
    }
}
